package vip.pwztx.api.result;

import lombok.Data;

/**
 * 返回结果类
 *
 * @author zhoubaohua
 * @date 2020/9/11
 */
@Data
public class Result {

    /**
     * 结果代码
     */
    private int code;

    /**
     * 提示消息
     */
    private String message;

    /**
     * 数据
     */
    private Object data;

    /**
     * 成功返回结果
     *
     * @return 成功结果
     */
    public static Result success() {
        return new Result() {{
            setCode(ResultCodeEnum.SUCCESS.code());
            setMessage(ResultCodeEnum.SUCCESS.message());
            setData(null);
        }};
    }

    /**
     * 成功返回结果
     *
     * @param data 数据
     * @return 成功结果
     */
    public static Result success(Object data) {
        return new Result() {{
            setCode(ResultCodeEnum.SUCCESS.code());
            setMessage(ResultCodeEnum.SUCCESS.message());
            setData(data);
        }};
    }

    /**
     * 成功返回结果
     *
     * @param message 提示消息
     * @param data    数据
     * @return 成功结果
     */
    public static Result success(String message, Object data) {
        return new Result() {{
            setCode(ResultCodeEnum.SUCCESS.code());
            setMessage(message);
            setData(data);
        }};
    }

    /**
     * 失败返回结果
     *
     * @return 失败结果
     */
    public static Result fail() {
        return new Result() {{
            setCode(ResultCodeEnum.FAIL.code());
            setMessage(ResultCodeEnum.FAIL.message());
            setData(null);
        }};
    }

    /**
     * 失败返回结果
     *
     * @param data 数据
     * @return 失败结果
     */
    public static Result fail(Object data) {
        return new Result() {{
            setCode(ResultCodeEnum.FAIL.code());
            setMessage(ResultCodeEnum.FAIL.message());
            setData(data);
        }};
    }

    /**
     * 失败返回结果
     *
     * @param message 提示消息
     * @param data    数据
     * @return 失败结果
     */
    public static Result fail(String message, Object data) {
        return new Result() {{
            setCode(ResultCodeEnum.FAIL.code());
            setMessage(message);
            setData(data);
        }};
    }

    /**
     * 异常返回
     *
     * @param throwable 产生的异常
     * @return 异常结果
     */
    public static Result throwable(Throwable throwable) {
        return new Result() {{
            setCode(ResultCodeEnum.EXCEPTION.code());
            setMessage(throwable.getMessage());
            setData(null);
        }};
    }

    /**
     * token错误
     *
     * @return 错误结果
     */
    public static Result authError() {
        return new Result() {{
            setCode(ResultCodeEnum.INVALID_AUTH_CODE.code());
            setMessage(ResultCodeEnum.INVALID_AUTH_CODE.message());
            setData(null);
        }};
    }
}
